#pragma once

#include <vector>
#include <algorithm>
#include <functional>

#include "compare.h"
#include "util.h"

using namespace std;

template<typename T>
class STLSort
{
  // uma cópia do vetor recebido no construtor, que será modificado
  vector<T> _v;

  // determina se a ordenação será crescente ou decrescente
  function<bool(const T&,const T&)> _compare;

public:
  STLSort(const vector<T> &v, const function<bool(const T&, const T&)> &c = CompareMax<T>()):
  _v(v),
  _compare([c](const T &t1, const T &t2) -> bool { return !c(t1, t2);})
  {
  }

  vector<T> sort()
  {
    std::sort(_v.begin(),_v.end(),_compare);
    return _v;
  }
};
